class: inverse,left, middle background-image: url(data:image/png;base64,#background.png) background-size: cover <img src="data:image/png;base64,#LOGO_DIPLOMADO.png" width="500px"/> ##Módulo 1: Manipulación y Análisis de Datos Geoespaciales ###R como SIG: Visualización de datos José A. Lastra<br> <a href="http://github.com/JoseLastra"> Github: JoseLastra</a><br> <a href="mailto:jose.lastra@pucv.cl"> jose.lastra@pucv.cl</a><br> .large[<b><a href="https://www.pucv.cl/uuaa/site/edic/base/port/labgrs.html">LabGRS</a> | Agosto 2022</b>] <br> --- class: center,middle background-image: url(data:image/png;base64,#labgrs_logo.png) background-size: 35% --- ## Contenidos .pull-left[ - Visualización de datos espaciales en R - ggplot2 y sf - Creación de mapa con ggplot2 * Creación de datos para mapeo * ggspatial - Creación de mapas con tmap * Datos vectoriales * Datos ráster ] .pull-right[ <img src="data:image/png;base64,#https://raw.githubusercontent.com/allisonhorst/stats-illustrations/main/rstats-artwork/r_rollercoaster.png" width="650px"/> © Allison Horst ] --- ## Paquetes para visualización de geodatos -- - Como ya vimos, los geo-datos pueden ser graficados de forma directa empleando la función **plot()** y puede mejorarse con algunos parámetros adicionales. -- - Sin embargo, existen librerÃas que permiten mejorar la representación tanto estática como dinámica de la información espacial. Algunas de estas librerÃas son: -- * [**ggplot2**](https://CRAN.R-project.org/package=ggplot2) para creación de gráficos y mapas empleando gramática de gráficos * [**tmap**](https://CRAN.R-project.org/package=tmap) elaboración de mapas temáticos en base a gramática de gráficos * [**rasterVis**](https://CRAN.R-project.org/package=rasterVis) complemento de **raster** y **terra** para visualizaciones mejoradas * [**mapsf**](https://CRAN.R-project.org/package=mapsf) creación de mapas temáticos * [**leaflet**](https://CRAN.R-project.org/package=leaflet) creación de mapas interactivos * etc... --- ## ggplot2 y sf -- - Gracias a la estructura con que son leÃdos nuestros archivos vectoriales con sf, podemos fácilmente graficar empleando ggplot como soporte gráfico empleando **geom_sf()**. -- - Cargue la capa **Manzanas_Maule.shp** y filtre una comuna ```r manzanas <- read_sf('Manzanas_Maule.shp') talca <- manzanas %>% filter(COMUNA == 'TALCA') ```
-- - Para usar **ggplot2** cargue la librerÃa empleando `library(ggplot2)` --- ## ggplot2 y sf ```r ggplot() + #crea el lienzo para el gráfico geom_sf(data = talca) # carga la capa por defecto ``` <img src="data:image/png;base64,#visualizacion_datos_files/figure-html/unnamed-chunk-3-1.png" width="100%" /> --- ## ggplot2 y sf -- - Podemos también ajustar la escala de visualización empleando **coord_sf()**. ```r ggplot() + #crea el lienzo para el gráfico geom_sf(data = talca, colour = 'black', size = 0.2) +# carga la capa por defecto coord_sf(xlim = c(-71.71, -71.59), # extent de longitud ylim = c(-35.46, -35.38), # extent de latitud expand = F) # asegurar la extensión ``` -- - Para ver más parámetros de **geom_sf()** recuerde usar `?geom_sf` --- <img src="data:image/png;base64,#visualizacion_datos_files/figure-html/unnamed-chunk-5-1.png" width="100%" style="display: block; margin: auto;" /> --- ## Preparación de datos -- - Para poder construir una mejor visualización, crearemos una capa nueva que disponga de una columna de nombre **AREA_HA** y el campo **personas**. -- - Por defecto **st_area()** calcula la superficie en metros, por lo cual convertiremos de forma directa a hectáreas -- ```r talca_densidad <- talca %>% select(personas) %>% #seleccionar campo de interés mutate(AREA_HA = as.numeric(st_area(.)/10000),#cálculo de área DENSIDAD = personas/AREA_HA) #y densidad por manzana ```
--- ## Mapa con ggplot2 -- - Con la información ya creada, prepararemos nuestro mapa de densidad por manzanas ```r ggplot() + #crea el lienzo para el gráfico geom_sf(data = talca_densidad, aes(fill = DENSIDAD), colour = 'black', #color de las lÃneas size = 0.2) +# tamaño de la lÃnea coord_sf(xlim = c(-71.71, -71.59), # extent de longitud ylim = c(-35.46, -35.38), # extent de latitud expand = F) + # asegurar la extensión scale_fill_viridis_c(trans = 'sqrt') + # paleta de colores con conversión de valores theme_bw() # cambio por un tema más simple ``` --- <img src="data:image/png;base64,#visualizacion_datos_files/figure-html/unnamed-chunk-9-1.png" width="100%" style="display: block; margin: auto;" /> --- ## Complementando con ggspatial -- - Para finalizar, usaremos [ggspatial](https://CRAN.R-project.org/package=ggspatial) que presenta varias funciones de fácil uso para elaboración rápida de figuras. -- - Instale la librerÃa empleando `install.packages('ggspatial')` y cárguela con `library(ggspatial)` ```r g <- ggplot() + #crea el lienzo para el gráfico geom_sf(data = talca_densidad, aes(fill = DENSIDAD), colour = 'black', #color de las lÃneas size = 0.2) +# tamaño de la lÃnea coord_sf(xlim = c(-71.71, -71.59), # extent de longitud ylim = c(-35.46, -35.38), # extent de latitud expand = F) + # asegurar la extensión scale_fill_viridis_c(trans = 'sqrt') + # paleta de colores con conversión de valores annotation_scale(location = "bl", width_hint = 0.2) + #escala gráfica annotation_north_arrow(location = "tr", which_north = "true", # norte height = unit(1,'cm'),width = unit(1,'cm'), style = north_arrow_fancy_orienteering(text_col = 'white',line_col = 'white', fill = 'white'))+ theme_bw() # cambio por un tema más simple #guardar mapa ggsave(g,"mapa_ggplot.png", width = 6, height = 6, dpi = 300) ``` --- <img src="data:image/png;base64,#visualizacion_datos_files/figure-html/unnamed-chunk-11-1.png" width="100%" style="display: block; margin: auto;" /> --- ##Creación de mapas con tmap -- - **tmap** es un paquete diseñado para la elaboración de mapas con parámetros flexibles y una sintaxis concisa que permite visualizaciones atractivas con pocas lÃneas de código. -- - Es compatible con diferentes clases espaciales, incluyendo raster, haciendo de su uso algo mucho más extensivo para la elaboración cartográfica. -- - Para instalar recuerde el uso de `install.packages('tmap')` y cargue empleando `library(tmap)` en su entorno de trabajo. ```r tm_shape(talca_densidad) + #plot básico de relleno tm_fill() tm_shape(talca_densidad) + #plot básico de bordes tm_borders() tm_shape(talca_densidad) + #plot básico combinado tm_fill() + tm_borders() ``` --- <img src="data:image/png;base64,#visualizacion_datos_files/figure-html/unnamed-chunk-13-1.png" width="100%" /> -- - Como se aprecia, la gramática del código es similar a la de **ggplot2** --- - Repliquemos un mapa temático similar al creado con ggplot ```r tm_shape(talca_densidad) + tm_fill(col = 'DENSIDAD',title = 'Densidad hab/ha') #mapa básico tm_shape(talca_densidad) + #clasificación por quantiles y paleta de colores personalizada tm_fill(col = 'DENSIDAD',title = 'Densidad hab/ha', style = 'quantile', palette = 'YlOrBr') ``` --- <img src="data:image/png;base64,#visualizacion_datos_files/figure-html/unnamed-chunk-15-1.png" width="100%" /> -- - Para revisar las paletas de colores base disponibles vitiste este [**enlace**](https://www.nceas.ucsb.edu/sites/default/files/2020-04/colorPaletteCheatsheet.pdf) --- ## Clases para clasificar -- - Algunos de los quiebres más útiles disponibles son - **style** = "pretty", opción por defecto, redondea los valores a números enteros en categorÃas igual distribuidas; - **style** = "equal" divide en clases iguales, siendo apropiada para variables con distribución uniforme; - **style** = "quantile" asegura tener el mismo numero de observaciones en cada clase, pero hace que los rangos varÃen ampliamente; - **style** = "jenks" identifica grupos con valores similares maximizando diferencias entre categorÃas; - **style** = "cont" (y "order") presenta una paleta continua no clasificada ideal para despliegue de archivos rásters ("order" ayuda con distribuciones sesgadas); - **style** = "cat" principalmente para variables categóricas. --- ## Mejorando nuestro mapa -- - Agregaremos componentes básicos a nuestro mapa para poder exportarlo a disco ```r tm_mapa <- tm_shape(talca_densidad) + tm_fill(col = 'DENSIDAD',title = 'Densidad hab/ha', style = 'quantile', palette = 'YlOrRd') + tm_legend(outside = TRUE, hist.width = 2) + # leyenda fuera del mapa tm_borders(lwd = 1,col = 'black') + #bordes del shape tm_grid() + #grilla simple de coordenadas tm_compass(type = "arrow", position = c("right", "top")) + # norte tm_scale_bar(breaks = c(0,2.5,5), text.size = 1,position = c("left", "bottom")) #escala tmap_save(tm_mapa, "my_map.png",height = 15,width = 15,units = 'in',dpi = 300) ``` --- <img src="data:image/png;base64,#visualizacion_datos_files/figure-html/unnamed-chunk-17-1.png" width="100%" style="display: block; margin: auto;" /> --- ## Ráster y tmap -- - Graficar rásters con **tmap** sigue la misma estructura de código que para vectores. -- - Cargue el shape de comunas de la región del Maule, filtre **Talca** y reproyecte al EPSG:4326 - Recuerde que para combinar el vector con nuestro ráster, debe ser **SpatVector** - Cargue el archivo ráster **s36w072.hgt** ```r talca_mask <- read_sf('Comunas_Maule.shp') %>% #lectura filter(COMUNA == 'Talca') %>% # filtro st_transform(4326) %>% #reproyección vect() #cambiando a SpatVector DEM <- rast('s36w072.hgt') #lectura del DEM ``` -- - Corte y enmascare con el shape de Talca sobre su DEM para graficar de forma más eficiente. ```r DEM_talca <- DEM %>% crop(talca_mask) %>% mask(talca_mask) ``` --- -- - Estructura base de gráfico en tmap ```r tm_shape(DEM_talca) + # DEM a graficar tm_raster(style = "cont", title = "Elevación (m)", #tipod e capa a representar palette = terrain.colors(64)) + #paleta de colores tm_legend(outside = TRUE) #leyenda ``` <img src="data:image/png;base64,#visualizacion_datos_files/figure-html/unnamed-chunk-21-1.png" width="100%" style="display: block; margin: auto;" /> --- ##Mejorando figura para exportar -- - Primero generaremos curvas de nivel que complementen la información empleando la función **as.contour()** de la librerÃa terra. -- - Esta función es un wrapper alrededor de la función **contourLines()** de **grDevices**. -- - Para conocer más argumentos disponibles `?contourLines` -- ```r dem_cont <- DEM_talca %>% #dem de entrada as.contour(levels = seq(0,500,50)) %>% #permite extraer contornos st_as_sf() #convertir a sf para comprobar los valores ``` --- ```r raster_map <- tm_shape(DEM_talca) + # capa ráster tm_raster(style = "quantile", n = 12, #cuantiles y número de clases title = "Elevation (m)", #tÃtulo palette = colorRampPalette( c("darkolivegreen4","yellow", "brown"))(12),#paleta legend.hist = TRUE) + #mostrar histograma tm_shape(dem_cont) + #curvas de nivel tm_lines(col = "black") + #color de las curvas tm_text("level", col = "white",size = 0.5) + #texto para curvas tm_legend(outside = TRUE, hist.width = 2)+ # posición de la leyenda tm_scale_bar(breaks = c(0,2.5,5), #escala text.size = 1,position = c("left", "bottom")) + tm_compass(type = "arrow", position = c("right", "top")) + tm_layout(bg.color = '#AED6F1', #cambiar background main.title = 'NASA DEM Comuna Talca')#tÃtulo principal tmap_save(raster_map,filename = 'my_rasterMap.png',width = 15, height = 15,units ='in',dpi = 300) ``` --- <img src="data:image/png;base64,#visualizacion_datos_files/figure-html/unnamed-chunk-24-1.png" width="100%" style="display: block; margin: auto;" /> --- ## BibliografÃa complementaria - [Tennekes, M., & Nowosad, J. (2021). tmap: Elegant and informative maps with tmap](https://r-tmap.github.io/tmap-book/) - [Lovelace, R., Nowosad, J., & Muenchow, J. (2022). Geocomputation with R. Chapman and Hall/CRC.](https://geocompr.robinlovelace.net/index.html) --- class: inverse middle 